AWS Session Tag + Auth0 Ruleを使ってメールアドレスでABACする #reinvent #Auth0JP
AWS Session Tagとは?
AWS Session Tagはre:Invent 2019期間中に新しく発表されたIdentity Federationのための新機能です。概要は臼田の記事を参考にしてください。
[UPDATE]フェデレーションでタグを渡せるSTSの新機能Session Tagがリリースされました #reinvent
先日、Auth0をSAML IdPとした場合のシングルサインオンで試した記事を公開しました。
【新機能】Auth0でAWSリソースをRBAC!AWS Session TagとAuth0を組み合わせてみた #reinvent #Auth0JP
今回はステップアップし、もう少し実用的な例に落とし込んでいきたいと思います。
メールアドレスでABAC
こちら の例ではあくまでどのユーザーも一律に同じRoleしか付与できない形となっていました。
Ruleにハードコードしているためです。
user.CostCenter = 'marketing';
この部分を、今回はAuth0のRoleを使って動的に設定されるようにしてみたいと思います。
Rule① ドメインによるRoleの判定、自動付与
まず新規Ruleを作ります。Ruleの名前は「Set role to a user」としました。
function (user, context, callback) { if (!user.email) { return callback(null, user, context); } user.app_metadata = user.app_metadata || {}; const addRoleToUser = function (user) { const endsWith = '@classmethod.jp'; if (user.email && (user.email.substring(user.email.length - endsWith.length, user.email.length) === endsWith)) { return 'engineering'; } return 'marketing'; }; const role = addRoleToUser(user); user.app_metadata.role = role; auth0.users.updateAppMetadata(user.user_id, user.app_metadata) .then(function () { callback(null, user, context); }) .catch(function (err) { callback(err); }); }
メールアドレスが @classmethod.jp
となっている場合は app_metadata
に role
をセットします。
Rule② SAMLアサーションへのRoleの付与
次にSAMLアサーションへのRoleの付与を行います。
function(user, context, callback) { var awsAccount = '【AWSアカウントIDを設定】'; var rolePrefix = `arn:aws:iam::` + awsAccount; var samlIdP = rolePrefix + `:saml-provider/auth0SamlProvider`; user.awsRole = rolePrefix + `:role/AccessByCostCenter,` + samlIdP; user.awsRoleSession = user.email; user.awsTagKeys = ['CostCenter', 'Project']; user.CostCenter = user.app_metadata.role; user.Project = 'website'; context.samlConfiguration.mappings = { 'https://aws.amazon.com/SAML/Attributes/Role': 'awsRole', 'https://aws.amazon.com/SAML/Attributes/RoleSessionName': 'awsRoleSession', 'https://aws.amazon.com/SAML/Attributes/PrincipalTag:CostCenter': 'CostCenter', 'https://aws.amazon.com/SAML/Attributes/PrincipalTag:Project': 'Project' }; callback(null, user, context); }
これで完成です!
試してみる
それでは試してみましょう。まずは suwa.yuki@classmethod.jp
でログインします。
Auth0では app_metadata.role
に engineering
が付与されています。
CostCenter
に engineering
が設定されているリソース以外は操作できません。
次に suwa.yuki@example.com
でログインします。
Auth0では app_metadata.role
に marketing
が付与されています。
CostCenter
に marketing
が設定されているリソース以外は操作できません。
上手く動きました。
まとめ
メールアドレスのドメインで判定してメタデータを変更し、Session TagのRBACに利用する方法をご紹介しました。
Ruleのスクリプトによっては、メールアドレス以外のユーザー情報をベースとした条件を作ることもできます。ぜひお試しください。